package com.zw.blog.service;

import com.zw.blog.po.Blog;
import com.zw.blog.vo.BlogQuery;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import javax.servlet.http.HttpSession;
import java.util.List;
import java.util.Map;

public interface BlogService {

    Blog getBlog(Long id);

    /**
     * markdown文本转html
     * @param id blog.id
     * @return 转换好的blog对象
     */
    Blog getAndConvert(Long id);

    /**
     * 用于admin模块，需要找到所有的博客，不论条件
     * @param pageable 可分页
     * @param blog 限定条件
     * @return 博客分页
     */
    Page<Blog> listBlog(Pageable pageable, BlogQuery blog);

    /**
     * type页展示博客，直接用blogQuery限定某个type.id，且公开，两个条件进行查询
     * @param pageable 可分页
     * @param blog 条件
     * @return 博客分页
     */
    Page<Blog> listBlogPublished(Pageable pageable, BlogQuery blog);

    /**
     * 首页展示博客，需要正式发布（不是草稿）且非私密
     * @param pageable 可分页
     * @return Page<Blog>
     */
    Page<Blog> listBlogPublished(Pageable pageable, HttpSession session);

    /**
     * 首页的search功能，在dao层限定查询条件
     * @param query 关键字
     * @param pageable 分页
     * @return 博客页面对象
     */
    Page<Blog> listBlog(String query, HttpSession session, Pageable pageable);

    /**
     * 用于tag页面展示博客，tag和blog为多对多，需要关联查询
     * @param tagId 标签id
     * @param session
     * @param pageable 可分页
     * @return blog页面
     */
    Page<Blog> listBlogPublished(Long tagId, HttpSession session, Pageable pageable);

    /**
     * 首页的最新推荐以及底部的最新博客
     * @param size 推荐博客的数量
     * @return Blog对象的list
     */
    List<Blog> listRecommendBlogTop(Integer size);

    Map<String, List<Blog>> archiveBlog(HttpSession session);

    Long countBlog(HttpSession session);

    Blog saveBlog(Blog blog);

    Blog updateBlog(Long id, Blog blog);

    void deleteBlog(Long id);
}
